﻿using System.Windows.Input;

using Windows.UI.Xaml;

namespace Uhimania.Libraries.Windows.Interactivity
{
    #region InvokeCommandAction
    /// <summary>
    /// 呼び出されると指定の <see cref="ICommand"/> を実行する。
    /// </summary>
    public class InvokeCommandAction : TriggerAction
    {
        #region Command

        /// <summary>
        /// <see cref="Command"/> を識別する依存関係プロパティ。
        /// </summary>
        public static readonly DependencyProperty CommandProperty =
            DependencyProperty.Register(
                "Command",
                typeof(ICommand),
                typeof(InvokeCommandAction),
                new PropertyMetadata(null)
            );

        /// <summary>
        /// このアクションが呼び出す <see cref="ICommand"/> を取得、または設定する。
        /// </summary>
        public ICommand Command
        {
            get { return this.GetValue(CommandProperty) as ICommand; }
            set { this.SetValue(CommandProperty, value); }
        }

        #endregion

        #region CommandParameter

        /// <summary>
        /// <see cref="CommandParameter"/> の依存関係プロパティ。
        /// </summary>
        public static readonly DependencyProperty CommandParameterProperty =
            DependencyProperty.Register(
                "CommandParameter",
                typeof(object),
                typeof(InvokeCommandAction),
                new PropertyMetadata(null)
            );

        /// <summary>
        /// コマンドパラメータを取得、または設定する。
        /// </summary>
        public object CommandParameter
        {
            get { return this.GetValue(CommandParameterProperty); }
            set { this.SetValue(CommandParameterProperty, value); }
        }

        #endregion

        #region Invoke
        /// <summary>
        /// アクションを呼び出す。
        /// </summary>
        /// <param name="parameter">アクションへのパラメータ。</param>
        protected override void Invoke(object parameter)
        {
            if (this.AssociatedObject == null || this.Command == null)
                return;

            if (!this.Command.CanExecute(this.CommandParameter))
                return;

            this.Command.Execute(this.CommandParameter);
        }
        #endregion
    }
    #endregion
}
